home *** CD-ROM | disk | FTP | other *** search
Wrap
package sun.tools.javac; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Enumeration; import java.util.Vector; import sun.tools.asm.Assembler; import sun.tools.asm.ConstantPool; import sun.tools.java.ClassDeclaration; import sun.tools.java.ClassDefinition; import sun.tools.java.ClassFile; import sun.tools.java.ClassNotFound; import sun.tools.java.CompilerError; import sun.tools.java.Constants; import sun.tools.java.Environment; import sun.tools.java.FieldDefinition; import sun.tools.java.Identifier; import sun.tools.java.Imports; import sun.tools.java.Type; import sun.tools.tree.CompoundStatement; import sun.tools.tree.Context; import sun.tools.tree.Node; import sun.tools.tree.Statement; import sun.tools.tree.StringExpression; public final class SourceClass extends ClassDefinition { Imports imports; SourceField defConstructor; ConstantPool tab = new ConstantPool(); private boolean basicChecking = false; private boolean basicCheckDone = false; private static Vector active = new Vector(); public SourceClass(Environment var1, int var2, ClassDeclaration var3, String var4, int var5, ClassDeclaration var6, ClassDeclaration[] var7, Imports var8) { super(var1.getSource(), var2, var3, var5, var6, var7); this.imports = var8; super.documentation = var4; } public final Imports getImports() { return this.imports; } public void addDependency(ClassDeclaration var1) { if (this.tab != null) { this.tab.put(var1); } } void checkOverride(Environment var1, ClassDeclaration var2, FieldDefinition var3) throws ClassNotFound { ClassDefinition var4 = var2.getClassDefinition(var1); for(FieldDefinition var5 = var4.getFirstMatch(var3.getName()); var5 != null; var5 = var5.getNextMatch()) { if (!var5.isPrivate() && !var5.isVariable() && var3.getType().equalArguments(var5.getType())) { if (var5.isFinal()) { var1.error(var3.getWhere(), "final.meth.override", var3, var5.getClassDeclaration()); return; } Type var6 = var3.getType().getReturnType(); Type var7 = var5.getType().getReturnType(); if (!var6.equals(var7)) { var1.error(var3.getWhere(), "redef.return.type", var3, var5); return; } if (var3.isStatic() != var5.isStatic()) { String var16 = var5.isStatic() ? "override.static.meth" : "override.instance.method.static"; var1.error(var3.getWhere(), var16, var5, var5.getClassDeclaration()); return; } if (!var3.isConstructor()) { if (!var3.isPublic() && !var5.isPrivate()) { if (var5.isPublic()) { var1.error(var3.getWhere(), "override.public", var5, var5.getClassDeclaration()); return; } if (var5.isProtected() && !var3.isProtected()) { var1.error(var3.getWhere(), "override.protected", var5, var5.getClassDeclaration()); return; } if (var3.isPrivate()) { var1.error(var3.getWhere(), "override.private", var5, var5.getClassDeclaration()); return; } } ClassDeclaration[] var8 = var3.getExceptions(var1); ClassDeclaration[] var9 = var5.getExceptions(var1); for(int var10 = 0; var10 < var8.length; ++var10) { ClassDefinition var11 = var8[var10].getClassDefinition(var1); boolean var12 = false; for(int var13 = 0; var13 < var9.length; ++var13) { if (var11.subClassOf(var1, var9[var13])) { var12 = true; break; } } if (!var12) { var1.error(var3.getWhere(), "invalid.throws", var11, var5, var5.getClassDeclaration()); return; } } } } } if (var4.getSuperClass() != null) { this.checkOverride(var1, var4.getSuperClass(), var3); } ClassDeclaration[] var14 = var4.getInterfaces(); for(int var15 = 0; var15 < var14.length; ++var15) { this.checkOverride(var1, var14[var15], var3); } } public void addField(Environment var1, FieldDefinition var2) { if (var2.isMethod()) { if (var2.isConstructor()) { if (var2.getClassDefinition().isInterface()) { var1.error(var2.getWhere(), "intf.constructor"); return; } if (var2.isNative() || var2.isAbstract() || var2.isStatic() || var2.isSynchronized() || var2.isFinal()) { var1.error(var2.getWhere(), "constr.modifier", var2); var2.subModifiers(1336); } } else if (var2.isInitializer() && var2.getClassDefinition().isInterface()) { var1.error(var2.getWhere(), "intf.initializer"); return; } if (var2.getClassDefinition().isInterface() && (var2.isStatic() || var2.isSynchronized() || var2.isNative() || var2.isFinal() || var2.isPrivate() || var2.isProtected())) { var1.error(var2.getWhere(), "intf.modifier.method", var2); var2.subModifiers(314); } if (var2.isTransient()) { var1.error(var2.getWhere(), "transient.meth", var2); var2.subModifiers(128); } if (var2.isVolatile()) { var1.error(var2.getWhere(), "volatile.meth", var2); var2.subModifiers(64); } if (var2.isStatic() && var2.isAbstract()) { var1.error(var2.getWhere(), "static.modifier", var2); var2.subModifiers(8); } if (!var2.isAbstract() && !var2.isNative()) { if (var2.getValue() == null) { if (var2.isConstructor()) { var1.error(var2.getWhere(), "no.constructor.body", var2); } else { var1.error(var2.getWhere(), "no.meth.body", var2); } var2.addModifiers(1024); } } else if (var2.getValue() != null) { var1.error(var2.getWhere(), "invalid.meth.body", var2); var2.setValue((Node)null); } Vector var3 = var2.getArguments(); if (var3 != null) { int var4 = var3.size(); for(int var5 = 0; var5 < var4; ++var5) { FieldDefinition var6 = (FieldDefinition)var3.elementAt(var5); if (var6.getType().isType(11)) { var1.error(var6.getWhere(), "void.argument", var6); } } } } else { if (var2.getType().isType(11)) { var1.error(var2.getWhere(), "void.inst.var", var2.getName()); return; } if (var2.isSynchronized() || var2.isAbstract() || var2.isNative()) { var1.error(var2.getWhere(), "var.modifier", var2); var2.subModifiers(1312); } if (var2.isTransient() && (var2.isFinal() || var2.isStatic())) { var1.error(var2.getWhere(), "transient.modifier", var2); var2.subModifiers(24); } if (var2.isFinal() && var2.getValue() == null) { var1.error(var2.getWhere(), "initializer.needed", var2); var2.subModifiers(16); } if (var2.getClassDefinition().isInterface() && (var2.isPrivate() || var2.isProtected())) { var1.error(var2.getWhere(), "intf.modifier.field", var2); var2.subModifiers(2); } } if (!var2.isInitializer()) { for(FieldDefinition var7 = ((ClassDefinition)this).getFirstMatch(var2.getName()); var7 != null; var7 = var7.getNextMatch()) { if (!var2.isMethod()) { var1.error(var2.getWhere(), "var.multidef", var2, var7); return; } if (var2.getType().equals(var7.getType())) { var1.error(var2.getWhere(), "meth.multidef", var2); return; } if (var2.getType().equalArguments(var7.getType())) { var1.error(var2.getWhere(), "meth.redef.rettype", var2, var7); return; } } } ((ClassDefinition)this).addField(var2); } private void addAbstractMethodsFromInterfaces(Environment var1, ClassDefinition var2) throws ClassNotFound { if (var2.isInterface()) { for(FieldDefinition var3 = var2.getFirstField(); var3 != null; var3 = var3.getNextField()) { if (var3.isMethod() && var3.isAbstract() && ((ClassDefinition)this).findMethod(var1, var3.getName(), var3.getType()) == null) { SourceField var4 = new SourceField(var3, this, var1); this.addField(var1, var4); } } } ClassDeclaration[] var7 = var2.getInterfaces(); for(int var5 = 0; var5 < var7.length; ++var5) { ClassDefinition var6 = var7[var5].getClassDefinition(var1); this.addAbstractMethodsFromInterfaces(var1, var6); } } public void check(Environment var1) throws ClassNotFound { Identifier var2 = ((ClassDefinition)this).getClassDeclaration().getName(); if (var1.verbose()) { var1.output("[checking class " + var2 + "]"); } this.basicCheck(var1); if (((ClassDefinition)this).isPublic()) { String var3 = ((ClassDefinition)this).getName().getName() + ".java"; String var4 = ((ClassFile)((ClassDefinition)this).getSource()).getName(); if (var1.warnings() && !var4.equals(var3)) { var1.error(((ClassDefinition)this).getWhere(), "public.class.file", this, var3); } } if (((ClassDefinition)this).isInterface()) { if (((ClassDefinition)this).isFinal()) { var1.error(((ClassDefinition)this).getWhere(), "final.intf", var2); } } else if (((ClassDefinition)this).getSuperClass() != null) { try { ClassDefinition var11 = ((ClassDefinition)this).getSuperClass().getClassDefinition(var1); if (!((ClassDefinition)this).canAccess(var1, ((ClassDefinition)this).getSuperClass())) { var1.error(((ClassDefinition)this).getWhere(), "cant.access.class", ((ClassDefinition)this).getSuperClass()); super.superClass = null; } else if (var11.isFinal()) { var1.error(((ClassDefinition)this).getWhere(), "super.is.final", ((ClassDefinition)this).getSuperClass()); super.superClass = null; } else if (var11.isInterface()) { var1.error(((ClassDefinition)this).getWhere(), "super.is.intf", ((ClassDefinition)this).getSuperClass()); super.superClass = null; } else if (((ClassDefinition)this).superClassOf(var1, ((ClassDefinition)this).getSuperClass())) { var1.error(((ClassDefinition)this).getWhere(), "cyclic.super"); super.superClass = null; } } catch (ClassNotFound var9) { var1.error(((ClassDefinition)this).getWhere(), "super.not.found", var9.name, this); super.superClass = null; } } for(int var12 = 0; var12 < super.interfaces.length; ++var12) { ClassDeclaration var13 = super.interfaces[var12]; try { if (!((ClassDefinition)this).canAccess(var1, var13)) { var1.error(((ClassDefinition)this).getWhere(), "cant.access.class", var13); } else if (!var13.getClassDefinition(var1).isInterface()) { var1.error(((ClassDefinition)this).getWhere(), "not.intf", var13); } else if (((ClassDefinition)this).isInterface() && ((ClassDefinition)this).implementedBy(var1, var13)) { var1.error(((ClassDefinition)this).getWhere(), "cyclic.intf", var13); } } catch (ClassNotFound var8) { var1.error(((ClassDefinition)this).getWhere(), "intf.not.found", var8.name, this); } } if (!((ClassDefinition)this).getError()) { try { for(FieldDefinition var14 = ((ClassDefinition)this).getFirstField(); var14 != null; var14 = var14.getNextField()) { if (!var14.isVariable()) { if (((ClassDefinition)this).getSuperClass() != null) { this.checkOverride(var1, ((ClassDefinition)this).getSuperClass(), var14); } for(int var5 = 0; var5 < super.interfaces.length; ++var5) { this.checkOverride(var1, super.interfaces[var5], var14); } } } } catch (ClassNotFound var10) { var1.error(((ClassDefinition)this).getWhere(), "class.not.found", var10.name, this); } if (!((ClassDefinition)this).getError()) { if (((ClassDefinition)this).isFinal() && ((ClassDefinition)this).isAbstract()) { var1.error(super.where, "final.abstract", ((ClassDefinition)this).getName().getName()); } if (!((ClassDefinition)this).isInterface() && !((ClassDefinition)this).isAbstract() && ((ClassDefinition)this).isAbstract(var1)) { super.modifiers |= 1024; String var15 = ((ClassDefinition)this).isFinal() ? "abstract.class.not.final" : "abstract.class"; Enumeration var17 = ((ClassDefinition)this).getAbstractFields(var1); while(var17.hasMoreElements()) { FieldDefinition var6 = (FieldDefinition)var17.nextElement(); var1.error(super.where, var15, this, var6, var6.getDefiningClassDeclaration()); } } for(FieldDefinition var16 = ((ClassDefinition)this).getFirstField(); var16 != null; var16 = var16.getNextField()) { try { var16.check(var1); } catch (ClassNotFound var7) { var1.error(var16.getWhere(), "class.not.found", var7.name, this); } } if (!((ClassDefinition)this).getError()) { ; } } } } protected void basicCheck(Environment var1) throws ClassNotFound { if (!this.basicChecking && !this.basicCheckDone) { this.basicChecking = true; var1 = new Environment(var1, this); if (((ClassDefinition)this).getSuperClass() != null) { try { ((ClassDefinition)this).getSuperClass().getClassDefinition(var1); } catch (ClassNotFound var7) { var1.error(((ClassDefinition)this).getWhere(), "super.not.found", var7.name, this); super.superClass = null; ((ClassDefinition)this).setError(true); } } for(int var2 = 0; var2 < super.interfaces.length; ++var2) { try { super.interfaces[var2].getClassDefinition(var1); } catch (ClassNotFound var6) { var1.error(((ClassDefinition)this).getWhere(), "intf.not.found", var6.name, this); ClassDeclaration[] var4 = new ClassDeclaration[super.interfaces.length - 1]; System.arraycopy(super.interfaces, 0, var4, 0, var2); System.arraycopy(super.interfaces, var2 + 1, var4, var2, var4.length - var2); super.interfaces = var4; ((ClassDefinition)this).setError(true); } } if (!((ClassDefinition)this).isInterface()) { if (((ClassDefinition)this).getFirstMatch(Constants.idInit) == null) { CompoundStatement var3 = new CompoundStatement(((ClassDefinition)this).getWhere(), new Statement[0]); Type var9 = Type.tMethod(Type.tVoid); SourceField var5 = new SourceField(((ClassDefinition)this).getWhere(), this, (String)null, ((ClassDefinition)this).isPublic() ? 1 : 0, var9, Constants.idInit, (Vector)null, new ClassDeclaration[0], var3); ((ClassDefinition)this).addField(var5); } if (!((ClassDefinition)this).getError()) { this.addAbstractMethodsFromInterfaces(var1, this); } } this.basicChecking = false; this.basicCheckDone = true; } } public void compile(Environment var1, OutputStream var2) throws InterruptedException, IOException { Vector var3 = active; synchronized(var3){} try { while(active.contains(((ClassDefinition)this).getName())) { active.wait(); } active.addElement(((ClassDefinition)this).getName()); } catch (Throwable var28) { throw var28; } try { this.compileClass(var1, var2); } catch (ClassNotFound var26) { throw new CompilerError(var26); } finally { Vector var5 = active; synchronized(var5){} try { active.removeElement(((ClassDefinition)this).getName()); active.notifyAll(); } catch (Throwable var25) { throw var25; } } } private void compileClass(Environment var1, OutputStream var2) throws IOException, ClassNotFound { var1 = new Environment(var1, this); this.check(var1); if (!((ClassDefinition)this).getError()) { Vector var3 = new Vector(); Vector var4 = new Vector(); CompilerField var5 = new CompilerField(new FieldDefinition(((ClassDefinition)this).getWhere(), this, 8, Type.tMethod(Type.tVoid), Constants.idClassInit, new ClassDeclaration[0], (Node)null), new Assembler()); Context var6 = new Context(var5.field); for(FieldDefinition var7 = ((ClassDefinition)this).getFirstField(); var7 != null; var7 = var7.getNextField()) { try { if (var7.isMethod()) { if (var7.isInitializer()) { ((SourceField)var7).code(var1, var5.asm); } else { CompilerField var8 = new CompilerField(var7, new Assembler()); ((SourceField)var7).code(var1, var8.asm); var4.addElement(var8); } } else { CompilerField var25 = new CompilerField(var7, (Assembler)null); var3.addElement(var25); if (var7.isStatic()) { var7.codeInit(var1, var6, var5.asm); } } } catch (CompilerError var22) { ((Throwable)var22).printStackTrace(); var1.error(var7, 0, "generic", var7.getClassDeclaration() + ":" + var7 + "@" + ((Throwable)var22).toString(), (Object)null, (Object)null); } } if (!var5.asm.empty()) { var5.asm.add(((ClassDefinition)this).getWhere(), 177); var4.addElement(var5); } if (!((ClassDefinition)this).getError()) { this.tab.put("Code"); this.tab.put("ConstantValue"); this.tab.put("LocalVariables"); this.tab.put("SourceFile"); this.tab.put("Exceptions"); if (!var1.optimize()) { this.tab.put("LineNumberTable"); } if (var1.debug()) { this.tab.put("LocalVariableTable"); } String var26 = ((ClassFile)((ClassDefinition)this).getSource()).getName(); this.tab.put(var26); this.tab.put(((ClassDefinition)this).getClassDeclaration()); if (((ClassDefinition)this).getSuperClass() != null) { this.tab.put(((ClassDefinition)this).getSuperClass()); } for(int var9 = 0; var9 < super.interfaces.length; ++var9) { this.tab.put(super.interfaces[var9]); } Enumeration var10 = var4.elements(); while(var10.hasMoreElements()) { CompilerField var11 = (CompilerField)var10.nextElement(); try { var11.asm.optimize(var1); var11.asm.collect(var1, var11.field, this.tab); this.tab.put(var11.name); this.tab.put(var11.sig); ClassDeclaration[] var12 = var11.field.getExceptions(var1); for(int var13 = 0; var13 < var12.length; ++var13) { this.tab.put(var12[var13]); } } catch (Exception var23) { ((Throwable)var23).printStackTrace(); var1.error(var11.field, -1, "generic", var11.field.getName() + "@" + ((Throwable)var23).toString(), (Object)null, (Object)null); var11.asm.listing(System.out); } } Enumeration var27 = var3.elements(); while(var27.hasMoreElements()) { CompilerField var28 = (CompilerField)var27.nextElement(); this.tab.put(var28.name); this.tab.put(var28.sig); Object var30 = var28.field.getInitialValue(); if (var30 != null) { this.tab.put(var30 instanceof String ? new StringExpression(var28.field.getWhere(), (String)var30) : var30); } } DataOutputStream var29 = new DataOutputStream(var2); var29.writeInt(-889275714); var29.writeShort(3); var29.writeShort(45); this.tab.write(var1, var29); var29.writeShort(((ClassDefinition)this).getModifiers() & 1553); var29.writeShort(this.tab.index(((ClassDefinition)this).getClassDeclaration())); var29.writeShort(((ClassDefinition)this).getSuperClass() != null ? this.tab.index(((ClassDefinition)this).getSuperClass()) : 0); var29.writeShort(super.interfaces.length); for(int var31 = 0; var31 < super.interfaces.length; ++var31) { var29.writeShort(this.tab.index(super.interfaces[var31])); } ByteArrayOutputStream var14 = new ByteArrayOutputStream(256); ByteArrayOutputStream var15 = new ByteArrayOutputStream(256); DataOutputStream var16 = new DataOutputStream(var14); var29.writeShort(var3.size()); Enumeration var17 = var3.elements(); while(var17.hasMoreElements()) { CompilerField var18 = (CompilerField)var17.nextElement(); Object var19 = var18.field.getInitialValue(); var29.writeShort(var18.field.getModifiers() & 223); var29.writeShort(this.tab.index(var18.name)); var29.writeShort(this.tab.index(var18.sig)); if (var19 != null) { var29.writeShort(1); var29.writeShort(this.tab.index("ConstantValue")); var29.writeInt(2); var29.writeShort(this.tab.index(var19 instanceof String ? new StringExpression(var18.field.getWhere(), (String)var19) : var19)); } else { var29.writeShort(0); } } var29.writeShort(var4.size()); Enumeration var32 = var4.elements(); while(var32.hasMoreElements()) { CompilerField var33 = (CompilerField)var32.nextElement(); var29.writeShort(var33.field.getModifiers() & 1343); var29.writeShort(this.tab.index(var33.name)); var29.writeShort(this.tab.index(var33.sig)); ClassDeclaration[] var20 = var33.field.getExceptions(var1); if (!var33.asm.empty()) { var29.writeShort(var20.length > 0 ? 2 : 1); var33.asm.write(var1, var16, var33.field, this.tab); int var21 = 0; if (!var1.optimize()) { ++var21; } if (var1.debug()) { ++var21; } var16.writeShort(var21); if (!var1.optimize()) { var33.asm.writeLineNumberTable(var1, new DataOutputStream(var15), this.tab); var16.writeShort(this.tab.index("LineNumberTable")); var16.writeInt(var15.size()); var15.writeTo(var14); var15.reset(); } if (var1.debug()) { var33.asm.writeLocalVariableTable(var1, var33.field, new DataOutputStream(var15), this.tab); var16.writeShort(this.tab.index("LocalVariableTable")); var16.writeInt(var15.size()); var15.writeTo(var14); var15.reset(); } var29.writeShort(this.tab.index("Code")); var29.writeInt(var14.size()); var14.writeTo(var29); var14.reset(); } else { var29.writeShort(var20.length > 0 ? 1 : 0); } if (var20.length > 0) { var29.writeShort(this.tab.index("Exceptions")); var29.writeInt(2 + var20.length * 2); var29.writeShort(var20.length); for(int var34 = 0; var34 < var20.length; ++var34) { var29.writeShort(this.tab.index(var20[var34])); } } } var29.writeShort(1); var29.writeShort(this.tab.index("SourceFile")); var29.writeInt(2); var29.writeShort(this.tab.index(var26)); var29.flush(); this.tab = null; } } } }